package com.h819.core.commons;

/*
 * 应用"单例模式" 只创建一个类。经过一次调用之后，在整个应用 jvm 的生命周期中，该类只创建一次
 * 之后调用该类的普通方法
 * 类不使用之后，最后会被垃圾回收
 * 
 * 需要保持唯一一份的变量，设置成静态变量，会在全局中保存
 * 
 * (讨论单例模式和静态变量的区别)
 */

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;

import java.io.File;

//调用方法：在每个 class 中，都如下方法调用，但只创建了一次
//private static PropertiesConfiguration conf = Configurations.getInstance("h819.properties");

//依赖包查看官方网站

public class Configurations {

	// 使用一个变量来在全局中缓存曾经创建的实例
	private static PropertiesConfiguration config = null;

	/**
	 * 通过静态方法调用，避免初始化被初始化，隐藏该构造器
	 * 
	 * @param propertyFileName
	 */
	private Configurations() {

	}

	// 提供一个静态方法，用于返回Singleton实例
	/**
	 * 应用"单例模式" 保证只只创建一个一个 PropertiesConfiguration 对象
	 * 
	 * @param propertyFileName
	 *            属性文件名称,放置在 classpath 中
	 */
	public static PropertiesConfiguration getInstance(String propertyFileName) {
		if (config == null) {
			// 注意路径默认指向的是classpath的根目录
			try {
				config = new PropertiesConfiguration(propertyFileName);
				// 更改属性值后，自动保存
				config.setAutoSave(true);
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return config;
	}
	/**
	 * 
	 * @param propertyFileAbsolutePathName 属性文件名称,指定的绝对路径
	 * @return
	 */
	public static PropertiesConfiguration getInstance(File propertyFileAbsolutePathName) {
		if (config == null) {
			// 文件是指定的绝对路径，如
			//c:\\h819.properties
			try {
				config = new PropertiesConfiguration(propertyFileAbsolutePathName);
				// 更改属性值后，自动保存
				config.setAutoSave(true);
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return config;
	}

	
	/**
	 * 得到指定名称的属性的字符串值。属性值中不能有标点逗号 "," 如果确实需要逗号 "," ，则用转义字符分开即 "\,"
	 * 
	 * @param key
	 *            属性名称
	 * @return 属性的值
	 */
	public String getString(String key) {
		return config.getString(key);
	}

	/**
	 * 得到指定名称的属性的字符串值,为多值字符串,值之间用","分开 如 keys=Deur 3,Deur 4,Deur 5
	 * 
	 * @param key
	 *            属性名称
	 * @return 属性的值
	 */
	public String[] getStringArray(String key) {
		return config.getStringArray(key);
	}

	/**
	 * 
	 * @param key
	 * @return
	 */
	public int getInt(String key) {
		return config.getInt(key);
	}

	public float getFloat(String key) {
		return config.getFloat(key);
	}

	/**
	 * 
	 * @param key
	 * @return
	 */
	public double getDouble(String key) {
		return config.getDouble(key);
	}

	/**
	 * 更改属性值
	 * 
	 * @param key
	 * @param value
	 */
	public void setProperty(String key, Object value) {
		config.setProperty(key, value);
	}

	private void test() {

		PropertiesConfiguration conf = Configurations
				.getInstance("h819.properties");

		System.out.println("com.test.id :" + conf.getFloat("com.test.id"));
		System.out.println("com.test.st :" + conf.getString("com.test.st"));

		// conf.setProperty("com.test.id", Double.valueOf("456"));
		conf.setProperty("com.test.st", String.valueOf("world"));
		System.out.println("com.test.st :" + conf.getString("com.test.st"));

	}

	public static void main(String[] args) {

	}
}
